package com.mashibing.webmaster.config;

import com.mashibing.webmaster.realm.ShiroRealm;
import org.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition;
import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @author SNA
 * @date 2025/10/23
 * @Description 创建Shiro配置类
 **/
@Configuration
public class ShiroConfig {

    /**
     * 创建并配置Shiro安全管理器Bean
     *
     * @param shiroRealm 自定义的Shiro Realm实现，用于用户认证和授权
     * @return 配置好的DefaultWebSecurityManager实例
     */
    @Bean
    public DefaultWebSecurityManager securityManager(ShiroRealm shiroRealm) {
        //1、构建安全管理器
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        //2、设置自定义的Realm
        securityManager.setRealm(shiroRealm);
        //3、返回安全管理器
        return securityManager;
    }


    /**
     * 配置Shiro过滤器链定义
     *
     * @return ShiroFilterChainDefinition 返回配置好的Shiro过滤器链定义对象
     */
    @Bean
    public ShiroFilterChainDefinition shiroFilterChainDefinition() {

        //1、 构建ShiroFilterChainDefinition实现类
        DefaultShiroFilterChainDefinition shiroFilter = new DefaultShiroFilterChainDefinition();

        //2、配置上过滤器链
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        // 配置登录接口允许匿名访问。anon代表放行，使用的是AnonymousFilter
        filterChainDefinitionMap.put("/public/**", "anon");
        filterChainDefinitionMap.put("/captcha.jpg", "anon");
        filterChainDefinitionMap.put("/sys/login", "anon");
        filterChainDefinitionMap.put("/index.html", "anon");
        filterChainDefinitionMap.put("/login.html", "anon");
        // 配置登出接口使用logout过滤器处理
        filterChainDefinitionMap.put("/logout", "logout");
        // 配置其他所有接口都需要认证后才能访问
        filterChainDefinitionMap.put("/**", "authc");
        // 将配置好的过滤器链定义添加到ShiroFilterChainDefinition对象中
        shiroFilter.addPathDefinitions(filterChainDefinitionMap);

        //3、返回配置好的过滤器链
        return shiroFilter;
    }
}
